package be.groept.ace.cursusplanning.view;

import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;

import be.groept.ace.cursusplanning.controller.InschrijvingController;
import be.groept.ace.cursusplanning.controller.OpstartController;
import be.groept.ace.cursusplanning.model.AangebodenCursus;
import be.groept.ace.cursusplanning.model.Cursist;
import be.groept.ace.cursusplanning.model.Inschrijving;
import be.groept.ace.cursusplanning.model.containers.Cursisten;
import be.groept.ace.cursusplanning.model.containers.Cursussen;
import be.groept.ace.cursusplanning.model.containers.Inschrijvingen;
import be.groept.ace.cursusplanning.utils.observer.EventArgs;
import be.groept.ace.cursusplanning.utils.observer.PropertyChanged;
import be.groept.ace.cursusplanning.utils.observer.Subject;
import be.groept.ace.cursusplanning.utils.observer.Subscriber;

public class InschrijvingFrame extends JFrame{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private InschrijvingController inschrijvingController;
	private OpstartController opstartController;
	
	private Cursisten cursistenModel;
	private Inschrijvingen inschrijvingenModel;
	private Cursussen cursussenModel;
	
	private JLabel lblCursisten, lblIngeschrevenCursussen, lblInTeSchrijvenCursussen, lblGeselecteerdeCursus, lblCursusInfo, lblLectorInfo, lblLokaalInfo, lblPlanningInfo, 
					lblAangeduideCursist, lblAangeduideCursistNaam, lblAangeduideCursistNummer;
	private JTextArea txtCursusInfo, txtLectorInfo, txtLokaalInfo, txtPlanningInfo, txtAangeduideCursistNaam, txtAangeduideCursistNummer;
	private JComboBox cmbCursisten;
	private JList lstInTeSchrijvenCursussen, lstIngeschrevenCursussen;
	private JButton btnSchrijfIn, btnSchrijfUit;
	
	private Subject<AangebodenCursus> schrijfInSubject;
	private Subject<Inschrijving> schrijfUitSubject;
	
	public InschrijvingFrame(OpstartController opstartController, InschrijvingController inschrijvingController, Cursisten cursistenModel, Inschrijvingen inschrijvingenModel, Cursussen cursussenModel) {
		super("Inschrijving cursussen");
		this.inschrijvingController = inschrijvingController;
		this.opstartController = opstartController;
		this.cursistenModel = cursistenModel;
		this.inschrijvingenModel = inschrijvingenModel;
		this.cursussenModel = cursussenModel;
		
		//Custom observer pattern om gegevens mee te geven...
		schrijfInSubject = new PropertyChanged<AangebodenCursus>();
		schrijfUitSubject = new PropertyChanged<Inschrijving>();
		
		addSchrijfInSubscriber(inschrijvingController.getSchrijfInSubscriber());
		addSchrijfUitSubscriber(inschrijvingController.getSchrijfUitSubscriber());
		
		Container container = getContentPane();
		container.setBackground(Color.YELLOW);
		container.setLayout(null);
		
		//Selecteer cursist
		lblCursisten = new JLabel("Selecteer een cursist");
		lblCursisten.setBounds(20, 20, 300, 30);
		cmbCursisten = new JComboBox(this.cursistenModel.getAllArray());
		cmbCursisten.addItemListener(this.inschrijvingController.getCursistComboBoxListener());
		cmbCursisten.setBounds(20, 50, 300, 30);
		
		Cursist aangeduideCursist = (Cursist)cmbCursisten.getSelectedItem();
		
		lblAangeduideCursist = new JLabel("Aangeduide cursist");
		lblAangeduideCursist.setBounds(435, 20, 300, 30);
		lblAangeduideCursistNummer = new JLabel("nummer");
		lblAangeduideCursistNummer.setBounds(435, 50, 100, 20);
		txtAangeduideCursistNummer = new JTextArea(aangeduideCursist.getCursistNummer());
		txtAangeduideCursistNummer.setBounds(535, 50, 200, 20);
		lblAangeduideCursistNaam = new JLabel("naam");
		lblAangeduideCursistNaam.setBounds(435, 80, 100, 20);
		txtAangeduideCursistNaam = new JTextArea(aangeduideCursist.getCursistNaam());
		txtAangeduideCursistNaam.setBounds(535, 80, 200, 20);
		
		
		//Selecteren van in te schrijven cursus
		lblInTeSchrijvenCursussen = new JLabel("Cursussen waarvoor deze cursist zich kan inschrijven");
		lblInTeSchrijvenCursussen.setBounds(20, 150, 400, 30);
		lstInTeSchrijvenCursussen = new JList(this.cursussenModel.getAlleAangebodenCursussenNogNietIngeschrevenVoorCursist(aangeduideCursist));
		lstInTeSchrijvenCursussen.setBounds(20, 180, 400, 200);
		
		//Al ingeschreven cursussen
		lblIngeschrevenCursussen = new JLabel("Reeds ingeschreven voor:");
		lblIngeschrevenCursussen.setBounds(500,150,400,30);
		Inschrijving[] inschrijvingenVanGeselecteerdeCursist = inschrijvingenModel.getInschrijvingenVoorCursist(aangeduideCursist);
		lstIngeschrevenCursussen = new JList(inschrijvingenVanGeselecteerdeCursist);
		lstIngeschrevenCursussen.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		lstIngeschrevenCursussen.addListSelectionListener(this.inschrijvingController.getReedsIngeschrevenListListener());
		lstIngeschrevenCursussen.setBounds(500,180,400,200);
		
		//Acties schrijf in en schrijf uit
		btnSchrijfIn = new JButton(">");
		btnSchrijfIn.setBounds(435, 190, 50, 30);
		btnSchrijfUit = new JButton("<");
		btnSchrijfUit.setBounds(435, 240, 50, 30);
		
		//Informatie sectie
		lblGeselecteerdeCursus = new JLabel("Geselecteerde cursus:");
		lblGeselecteerdeCursus.setBounds(20, 400, 150, 20);
		
		lblCursusInfo = new JLabel("Cursus");
		lblCursusInfo.setBounds(20, 430, 50, 20);
		
		lblLectorInfo = new JLabel("Lector");
		lblLectorInfo.setBounds(20, 460, 50, 20);
		
		lblLokaalInfo = new JLabel("Lokaal");
		lblLokaalInfo.setBounds(20, 490, 50, 20);
		
		lblPlanningInfo = new JLabel("Planning");
		lblPlanningInfo.setBounds(20, 520, 50, 20);
		
		txtCursusInfo = new JTextArea();
		txtCursusInfo.setBounds(120, 430, 300, 20);
		
		txtLectorInfo = new JTextArea();
		txtLectorInfo.setBounds(120, 460, 300, 20);
		
		txtLokaalInfo = new JTextArea();
		txtLokaalInfo.setBounds(120, 490, 300, 20);
		
		txtPlanningInfo = new JTextArea();
		txtPlanningInfo.setBounds(120, 520, 300, 20);
		
		//toevoegen van elementen aan container
		container.add(lblCursisten);
		container.add(cmbCursisten);
		container.add(lblAangeduideCursist);
		container.add(lblAangeduideCursistNummer);
		container.add(txtAangeduideCursistNummer);
		container.add(lblAangeduideCursistNaam);
		container.add(txtAangeduideCursistNaam);
		container.add(lblIngeschrevenCursussen);
		container.add(lstIngeschrevenCursussen);
		container.add(lblInTeSchrijvenCursussen);
		container.add(lstInTeSchrijvenCursussen);
		container.add(btnSchrijfIn);
		container.add(btnSchrijfUit);
		container.add(lblGeselecteerdeCursus);
		container.add(lblCursusInfo);
		container.add(lblLectorInfo);
		container.add(lblLokaalInfo);
		container.add(lblPlanningInfo);
		container.add(txtCursusInfo);
		container.add(txtLectorInfo);
		container.add(txtLokaalInfo);
		container.add(txtPlanningInfo);
		
		this.addWindowListener(new WindowAdapter()  
		{	          
 			public void windowClosing(WindowEvent e){  
 				setVisible(false);             
 				toonMenu();
 			}	
		});
		
		this.inschrijvingenModel.addInschrijvingenVoorCursistSubscriber(new Subscriber<Inschrijving[]>() {
			@Override
			public void update(EventArgs<Inschrijving[]> event) {
				lstIngeschrevenCursussen.setListData(event.getSource());
			}
		});
		
		this.cursistenModel.addAangeduideCursistSubscriber(new Subscriber<Cursist>() {

			@Override
			public void update(EventArgs<Cursist> event) {
				Cursist c = event.getSource();
				txtAangeduideCursistNummer.setText(c.getCursistNummer());
				txtAangeduideCursistNaam.setText(c.getCursistNaam());
			}
			
		});
		
		this.inschrijvingenModel.addgeselecteerdeInschrijvingSubscriber(new Subscriber<Inschrijving[]>() {

			@Override
			public void update(EventArgs<Inschrijving[]> event) {
				Inschrijving[] geselecteerdeInschrijvingen = event.getSource();
				if (geselecteerdeInschrijvingen.length > 0) {
					AangebodenCursus ac = geselecteerdeInschrijvingen[0].getAangebodenCursus();
					txtCursusInfo.setText(ac.getCursus().toString());
					txtLectorInfo.setText(ac.getLector().toString());
					txtLokaalInfo.setText(ac.getLokaal().toString());
					txtPlanningInfo.setText(ac.getTijdsMoment1Dag().toString());
				} else {
					txtCursusInfo.setText("");
					txtLectorInfo.setText("");
					txtLokaalInfo.setText("");
					txtPlanningInfo.setText("");
				}
			}
			
		});
		
		this.cursussenModel.addAlleAangebodenCursussenNogNietIngeschrevenVoorCursistSubscriber(new Subscriber<AangebodenCursus[]>() {

			@Override
			public void update(EventArgs<AangebodenCursus[]> event) {
				lstInTeSchrijvenCursussen.setListData(event.getSource());
			}
			
		});
		
		
		
		this.btnSchrijfIn.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				if(lstInTeSchrijvenCursussen != null)
					schrijfInSubject.notifySubscribers(new EventArgs<AangebodenCursus>((AangebodenCursus)lstInTeSchrijvenCursussen.getSelectedValue()));
			}
		});
		
		this.btnSchrijfUit.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				if(lstIngeschrevenCursussen.getSelectedValue() != null)
					schrijfUitSubject.notifySubscribers(new EventArgs<Inschrijving>((Inschrijving)lstIngeschrevenCursussen.getSelectedValue()));
			}
			
		});
		
		this.setSize(1000, 750);
	}
	
	private void toonMenu(){
		opstartController.execute();
	}
	
	public void addSchrijfInSubscriber(Subscriber<AangebodenCursus> subscriber) {
		schrijfInSubject.addSubscriber(subscriber);
	}
	
	public void addSchrijfUitSubscriber(Subscriber<Inschrijving> subscriber) {
		schrijfUitSubject.addSubscriber(subscriber);
	}
}
